Monografias.com > Sin categoría
Descargar Imprimir Comentar Ver trabajos relacionados

Introducción a MPI (página 2)




Enviado por Pablo Turmero



Partes: 1, 2

Monografias.com

En FORTRAN será vía el llamado a subrutinas:
call MPI_ROUTINE (ARGUMENTOS, IERROR)

En C el uso será de la forma:
MPI_Xxxxxx(argumentos)
El primer paso será invocar a la biblioteca adecuada (C: mpi.h, F: mpif.h)p.e.: #include "mpi.h"
Todo programa MPI tiene que ser inicializado y finalizado (para liberar correctamente los recursos).
¿¿Cómo funciona??

Monografias.com

Versión Fortran
PROGRAM simple
include 'mpif.h'
integer errcode
! Inicializar MPI
call MPI_INIT (errcode)
! Parte Principal del Prog…
! Terminar MPI
call MPI_FINALIZE (errcode)
end
Versión C
#include "mpi.h"
/* Headers */
main(int argc, char **argv)
{
/* Inicializar MPI */
MPI_Init (&argc, &argv);
/* Parte principal del Prog….. */
/* Terminar MPI */
MPI_Finalize ();
exit (0);
}
Un programa MPI: el esquema básico

Monografias.com

Los siguientes pasos son definir un comunicador, indicar el número total de procesadores en el sistema y el rango de cada uno dentro del conjunto.
El comunicador típico es MPI_COMM_WORLD (definido en mpi.h/mpif.h): son todos los nodos requeridos al sistema.
(Pueden definirse otros comunicadores si es necesario)

Monografias.com

"Hola Mundo" en FORTRAN con MPI
PROGRAM main
include 'mpif.h'
integer errcode, rank, size
call MPI_INIT (errcode)
call MPI_Comm_rank (MPI_COMM_WORLD, rank, errcode)
call MPI_Comm_size (MPI_COMM_WORLD, size, errcode)
print*, "Hola Mundo! Soy el proceso", rank, " de", size
call MPI_FINALIZE (errcode)
end

Monografias.com

"Hola Mundo" en C con MPI
#include "mpi.h"
#include < stdio.h>
int main(int argc, char **argv)
{ int rank, size;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD, &size);
printf( "Hola Mundo! Soy el proceso %d de %dn", rank,size);
MPI_Finalize ();
exit (0);
}

Monografias.com

¿Qué es un mensaje?
Son paquetes de datos que se intercambian entre los diferentes subprogramas.
Un mensaje se compone de: datos + direccionamiento:
Punto de origen de los datos
Tipo de datos a intercambiar
Longitud de los datos a intercambiar
Destino (u origen)
Una etiqueta que lo distinga
Comunicador
Intercambio de Mensajes

Monografias.com

Tipos de Datos
El usuario puede construir otros tipos de datos.
MPI soporta arquitecturas heterogéneas, la definición del tipode datos a intercambiar hace que sean compatibles.

Monografias.com

Comunicaciones Punto a Punto
Es la forma mas simple de transmisión de mensajes
Un proceso envia un mensaje a otro
Existen diferentes formas de hacerlo (sincrónicamente, asincrónicamente, bloqueante, no bloqueante, etc).

Monografias.com

Ejemplo
Quiero calcular ?como :

Monografias.com

double precision mypi, pi, h, sum, x, f, a
integer n, myid, size, i, rc, ierr, status
c — funcion a integrar
f(a) = 4.d0 / (1.d0 + a*a)

c — Numero de intervalos
read(5,*) n

c — tamaño del intervalo
h = 1.0d0/n

c — realiza las sumas
sum = 0.0d0
do i = 1, n
x = h * (dble(i) – 0.5d0)
sum = sum + f(x)
enddo
mypi = h * sum

pi=mypi
write(6, '(" pi es aproximadamente:", F18.16)') pi

end

Monografias.com

include 'mpif.h'
double precision mypi, pi, h, sum, x, f, a
integer n, myid, size, i, rc, ierr, status
c — funcion a integrar
f(a) = 4.d0 / (1.d0 + a*a)
call MPI_INIT( ierr )
call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
call MPI_COMM_SIZE( MPI_COMM_WORLD, size, ierr )
print *, "Proceso ", myid, " de ", size, " funcionando"
if(myid.eq.0) then
read(5,*) n
endif
if(myid.eq.0) then
do i=1,size-1
call MPI_SEND(n,1,MPI_INTEGER,i,1,MPI_COMM_WORLD,ierr)
enddo
else
call MPI_RECV(n,1,MPI_INTEGER,0,1,MPI_COMM_WORLD,status,ierr)
endif
h = 1.0d0/n

Monografias.com

sum = 0.0d0
do i = myid+1, n, size
x = h * (dble(i) – 0.5d0)
sum = sum + f(x)
enddo
mypi = h * sum
if(myid.eq.0) then
pi=mypi
do i=1,size-1
call MPI_RECV(mypi,1,MPI_DOUBLE_PRECISION,MPI_ANY_SOURCE,MPI_ANY_TAG, MPI_COMM_WORLD,status,ierr)
pi=pi+mypi
enddo
else
call MPI_SEND(mypi,1,MPI_DOUBLE_PRECISION,0,99, MPI_COMM_WORLD,ierr)
endif
if (myid .eq. 0) then
write(6, '(" pi es aproximadamente:", F18.16)') pi
endif
call MPI_FINALIZE(rc)
end

Partes: 1, 2
 Página anterior Volver al principio del trabajoPágina siguiente 

Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

Categorias
Newsletter